package com.sacfa.rrhh.bo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import javax.swing.JOptionPane;

import org.apache.log4j.Logger;

import com.sacfa.commons.beans.Direccion;
import com.sacfa.commons.beans.Opcion;
import com.sacfa.commons.bo.DireccionBo;
import com.sacfa.commons.connection.PoolConexion;
import com.sacfa.commons.utilities.SACFAExceptions;
import com.sacfa.rrhh.beans.Empleado;
import com.sacfa.rrhh.beans.Puesto;
import com.sacfa.rrhh.sql.EmpleadoSQL;

/**
 * @author Leizar Zar
 * @version 1.0
 * @created 11-ago-2013
 */
public class EmpleadoBo {
	private static Logger log = Logger.getLogger(EmpleadoBo.class);
	
	public int registrar(Empleado empleado, Connection conex){
		int idEmpleado = 0;
		PreparedStatement stm = null;
		ResultSet rs = null;
		
		try {
			stm = conex.prepareStatement(EmpleadoSQL.INSERT, Statement.RETURN_GENERATED_KEYS);
			stm.setString(1, empleado.getNombre());
			stm.setString(2, empleado.getApellidoPaterno());
			stm.setString(3, empleado.getApellidoMaterno());
			stm.setInt(4, empleado.getPuesto().getId());
			stm.setString(5, empleado.getRFC());
			stm.setBigDecimal(6, empleado.getSalarioXHora());
			stm.setInt(7, empleado.getEstatus().getId());
			stm.setInt(8, empleado.getDireccion().getId());
			stm.executeUpdate();
			
			rs = stm.getGeneratedKeys();
			rs.next();
			idEmpleado = rs.getInt(1);
		} catch(SQLException ex) {
			log.info("Error SQL: " + ex);
		}
		return idEmpleado;
	}

	public Empleado consultar(Empleado empleado){
		Puesto puesto = new Puesto();
		Opcion opcion = new Opcion();
		Direccion direccion = new Direccion();
		Direccion direccion2 = new Direccion();
		DireccionBo direccionBo = new DireccionBo();
		PreparedStatement stm = null;
		ResultSet rs = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			stm = conex.prepareStatement(EmpleadoSQL.SELECT_ONE);
			stm.setString(1, empleado.getNombre());
			stm.setString(2, empleado.getApellidoPaterno());
			rs = stm.executeQuery();
			
			empleado = new Empleado();
			if(rs.next()){
				empleado.setId(rs.getInt(1));
				empleado.setNombre(rs.getString(2));
				empleado.setApellidoPaterno(rs.getString(3));
				empleado.setApellidoMaterno(rs.getString(4));
				puesto.setId(rs.getInt(5));
				empleado.setPuesto(puesto);
				empleado.setRFC(rs.getString(6));
				empleado.setSalarioXHora(rs.getBigDecimal(7));
				opcion.setId(rs.getInt(8));
				empleado.setEstatus(opcion);
				direccion.setId(rs.getInt(9));
				direccion2 = direccionBo.consultar(direccion);
				direccion.setCalle(direccion2.getCalle());
				direccion.setCodigoPostal(direccion2.getCodigoPostal());
				direccion.setNumeroExterno(direccion2.getNumeroExterno());
				direccion.setNumeroInterno(direccion2.getNumeroInterno());
				direccion.setColonia(direccion2.getColonia());
				empleado.setDireccion(direccion);
			} else {
				JOptionPane.showMessageDialog(null, "No existe un empleado con esos datos", 
						"Datos erroneos", JOptionPane.INFORMATION_MESSAGE);
				empleado = null;
			}
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
		return empleado;
	}
	
	public Collection<Empleado> consultaGeneral(){
		Collection<Empleado> empleados = new ArrayList<Empleado>();
		Empleado empleado = null;
		Puesto puesto = null;
		Opcion opcion = null;
		Direccion direccion = null;
		PreparedStatement stm = null;
		ResultSet rs = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			stm = conex.prepareStatement(EmpleadoSQL.SELECT_ALL);
			rs = stm.executeQuery();
			
			while(rs.next()){
				empleado = new Empleado();
				empleado.setId(rs.getInt(1));
				empleado.setNombre(rs.getString(2));
				empleado.setApellidoPaterno(rs.getString(3));
				empleado.setApellidoMaterno(rs.getString(4));
				puesto = new Puesto();
				puesto.setId(rs.getInt(5));
				empleado.setPuesto(puesto);
				empleado.setRFC(rs.getString(6));
				empleado.setSalarioXHora(rs.getBigDecimal(7));
				opcion = new Opcion();
				opcion.setId(rs.getInt(8));
				empleado.setEstatus(opcion);
				direccion = new Direccion();
				direccion.setId(rs.getInt(9));
				empleado.setDireccion(direccion);
				empleados.add(empleado);
			}
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
		return empleados;
	}
	
	public void modificar(Empleado empleado){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(EmpleadoSQL.UPDATE);
			stm.setString(1, empleado.getNombre());
			stm.setString(2, empleado.getApellidoPaterno());
			stm.setString(3, empleado.getApellidoMaterno());
			stm.setInt(4, empleado.getPuesto().getId());
			stm.setString(5, empleado.getRFC());
			stm.setBigDecimal(6, empleado.getSalarioXHora());
			stm.setInt(7, empleado.getEstatus().getId());
			stm.setInt(8, empleado.getDireccion().getId());
			stm.setInt(9, empleado.getId());
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
	
	public void cambiarStatus(Empleado empleado){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(EmpleadoSQL.STATUS_CHANGE);
			stm.setInt(1, empleado.getId());
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
}
